﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Aulac.Client.Data.XmlQuery;
using Aulac.Global.Xml;
using Aulac.Global.Common;
using Aulac.Rsc.Bss;
using Aulac.Rsc.Bss.Tags;

namespace Aulac.Client.Data.Bss.Helper
{
    public class MdcExamHelper
    {        
        /// <summary>
        /// 
        /// </summary>
        /// <param name="pTbName"></param>
        /// <param name="pArrFieldFillter"></param>
        /// <param name="pArrValueField"></param>
        /// <returns></returns>
        public static string GetVchNoOnServer(string pTbName, string[] pArrFieldFillter, string[] pArrValueField)
        {
            return "";
        }
        
        /// <summary>
        /// Kiểm tra xem pVchNo đã tồn tại trên Server trong TbName chưa ?
        /// </summary>
        /// <param name="pTbName">Tên bảng cần kiểm tra.</param>
        /// <param name="pValueVchNo">Giá trị Cần Kiểm tra.</param>
        /// <returns>Return true nếu đã có rồi. Ngược lại Return False nếu chưa có</returns>
        public static bool ChkVchNoOnServer(string pTbName, string pValueVchNo)
        {
            return false;
        }

        /// <summary>
        /// Trả về một No mới.
        /// </summary>
        /// <param name="pTbName">Tên bảng cần lấy No mới</param>
        /// <param name="pTitle">Chuổi hiển thị đầu No. Ví dụ: Số Khám Bệnh -> KBNo/</param>
        /// <param name="pTagField">Tên trường cần lấy No</param>
        /// <returns>No mới</returns>
        public static string GetNewNo(string pTbName, string pTitle, string pTagField)
        {
            /* Author: H.Rin */
            /* Code Update: 10/23/2010 */

            ClientExecXmlQueryData query = new ClientExecXmlQueryData();
            query.SetRequestInfo(Verb.AulacVerb.DataQuery.QueryData, Verb.AulacVerb.DataQuery.Noun.AulacDataQuery);
            query.SetVchHeaderElm();
            string sqlQuery = string.Format("SELECT MAX({0}) AS {0} ", pTagField);
            sqlQuery += string.Format(" FROM {0} ", pTbName);
            sqlQuery += string.Format(" WHERE {0} IN ", pTagField);
            sqlQuery += string.Format(" (SELECT DISTINCT {0} FROM {1} WHERE LEN({0}) = (SELECT (MAX(LEN({0}))) FROM {1}))", pTagField, pTbName);
            query.ObjQueryVchHeader.SqlQueryString = sqlQuery;

            try
            {
                if ((pTitle.LastIndexOf('/') == -1) || (pTitle.LastIndexOf('-') == -1) || (pTitle.LastIndexOf('\\') == -1))
                    pTitle += "/";
                string mNo = XmlProcess.GetValueVchHeader(query.ExecureQueryData(), pTagField);
                if (ValueHelper.isEmpty(mNo))
                    return pTitle + "0000001";
                int indexLastChr = mNo.LastIndexOf('/') != -1 ? (mNo.LastIndexOf('/')) : (mNo.LastIndexOf('-') != -1 ? mNo.LastIndexOf('-') : mNo.LastIndexOf('\\'));                
                ++indexLastChr; // Do chỉ số chuổi bắt đầu tính bằng 0 nên cộng thêm một để tính thêm 'Ký tự'                
                double mValue = 0;
                try
                {
                    mValue = (double)(ValueHelper.ChangeType(mNo.Substring(indexLastChr), typeof(double)));
                }
                catch
                {
                    return pTitle + "0000001";
                }
                // Gán lại Giá trị Title
                pTitle = mNo.Substring(0, indexLastChr);
                ++mValue;// Tăng số chứng từ. mNo là số chứng từ có giá trị lớn nhất hiện tại trong CSDL. 
                int mIndexAdd = mNo.Length - indexLastChr - mValue.ToString().Length;
                mNo = mValue.ToString();
                for (int i = 0; i < mIndexAdd; i++)
                    mNo = "0" + mNo;
                return pTitle + mNo;
            }
            catch (Exception Ex)
            {
                throw Ex;
            }
        }


        public static string GetNewNo(string pTbName, string pTagField, VchTypes pVchType)
        {
            /* Author: H.Rin */
            /* Code Update: 10/24/2010 */

            ClientExecXmlQueryData query = new ClientExecXmlQueryData();
            query.SetRequestInfo(Verb.AulacVerb.DataQuery.QueryData, Verb.AulacVerb.DataQuery.Noun.AulacDataQuery);
            query.SetVchHeaderElm();
            string sqlQuery = string.Format("SELECT MAX({0}) AS {0} FROM {1} ", pTagField, pTbName);
            sqlQuery += string.Format(" WHERE {0} IN (SELECT DISTINCT {0} FROM {1} WHERE ({2} = @{2}) ", pTagField, pTbName, tagGeneral.VchTypeID);
            sqlQuery += string.Format(" AND LEN({0}) = (SELECT (MAX(LEN({0}))) FROM {1} WHERE {2} = @{2}))", pTagField, pTbName, tagGeneral.VchTypeID);
            query.ObjQueryVchHeader.SqlQueryString = sqlQuery;
            query.ObjQueryVchHeader.AddValueParamFilterItem(tagGeneral.VchTypeID, tagGeneral.VchTypeID, pVchType);
            query.SetVchLinesElm();
            string sqlQueryL = string.Format("SELECT {0} FROM {1} ", tagVch.Common.VchSign, TableNames.Dm_VchTypes);
            sqlQueryL += string.Format(" WHERE {0} = @{0} ", tagGeneral.VchTypeID);
            query.ObjQueryVchLines.SqlQueryString = sqlQueryL;
            query.ObjQueryVchLines.AddValueParamFilterItem(tagGeneral.VchTypeID, tagGeneral.VchTypeID, pVchType);
            
            try
            {
                System.Xml.XmlDataDocument xmlDoc = query.ExecureQueryData();
                string mNo = XmlProcess.GetValueVchHeader(xmlDoc, pTagField);
                char mChr = mNo.LastIndexOf('/') != -1 ? '/' : (mNo.LastIndexOf('-') != -1 ? '-' : (mNo.LastIndexOf('\\') != -1 ? '\\' : '/'));
                // Gán lại Giá trị Title
                string pTitle = XmlProcess.GetValueVchLineItemFirst(xmlDoc, tagVch.Common.VchSign) + mChr.ToString();
                if (ValueHelper.isEmpty(mNo))
                    return pTitle + "0000001";                
                int indexLastChr = mNo.LastIndexOf(mChr);
                ++indexLastChr; // Do chỉ số chuổi bắt đầu tính bằng 0 nên cộng thêm một để tính thêm 'Ký tự'
                double mValue = 0;
                try { mValue = (double)(ValueHelper.ChangeType(mNo.Substring(indexLastChr), typeof(double)));}
                catch { return pTitle + "0000001";}
                ++mValue; // Tăng số chứng từ. mNo là số chứng từ có giá trị lớn nhất hiện tại trong CSDL. 
                int mIndexAdd = mNo.Length - indexLastChr - mValue.ToString().Length;
                mNo = mValue.ToString();
                for (int i = 0; i < mIndexAdd; i++)
                    mNo = "0" + mNo;
                return pTitle + mNo;
            }
            catch (Exception Ex)
            {
                throw Ex;
            }
        }

        /// <summary>
        /// Tao mot So CT mới trong PTbName.
        /// </summary>
        /// <param name="pTbName">Table Can tao VchNo</param>
        /// <param name="pVchType">Kí hiệu đầu của VchNo. Hay loại phiếu</param>
        /// <returns></returns>
        public static string GetNewNo(string pTbName, VchTypes pVchType)
        {
            /* Author: H.Rin */
            /* Code Update: 10/24/2010 */

            string mTagField = "VchNo";
            ClientExecXmlQueryData query = new ClientExecXmlQueryData();
            query.SetRequestInfo(Verb.AulacVerb.DataQuery.QueryData, Verb.AulacVerb.DataQuery.Noun.AulacDataQuery);
            query.SetVchHeaderElm();
            string sqlQuery = string.Format("SELECT MAX({0}) AS {0} FROM {1} ", mTagField, pTbName);
            sqlQuery += string.Format(" WHERE {0} IN (SELECT DISTINCT {0} FROM {1} WHERE ", mTagField, pTbName);
            //sqlQuery += string.Format(" ({0} = @{0} ) AND ", tagMdcFiles.MdcFiles.DateTimeExam);
            sqlQuery += string.Format(" LEN({0}) = (SELECT (MAX(LEN({0}))) FROM {1}))", mTagField, pTbName);
            query.ObjQueryVchHeader.SqlQueryString = sqlQuery;
            query.ObjQueryVchHeader.AddValueParamFilterItem(tagGeneral.VchTypeID, tagGeneral.VchTypeID, pVchType);
            //query.ObjQueryVchHeader.AddValueParamFilterItem(tagMdcFiles.MdcFiles.DateTimeExam, tagMdcFiles.MdcFiles.DateTimeExam, DateTime.Now.Date.ToShortDateString());
            query.SetVchLinesElm();
            string sqlQueryL = string.Format("SELECT {0} FROM {1} ", tagVch.Common.VchSign, TableNames.Dm_VchTypes);
            sqlQueryL += string.Format(" WHERE {0} = @{0} ", tagGeneral.VchTypeID);
            query.ObjQueryVchLines.SqlQueryString = sqlQueryL;
            query.ObjQueryVchLines.AddValueParamFilterItem(tagGeneral.VchTypeID, tagGeneral.VchTypeID, pVchType);

            try
            {
                System.Xml.XmlDataDocument xmlDoc = query.ExecureQueryData();
                string mNo = XmlProcess.GetValueVchHeader(xmlDoc, mTagField);
                char mChr = mNo.LastIndexOf('/') != -1 ? '/' : (mNo.LastIndexOf('-') != -1 ? '-' : (mNo.LastIndexOf('\\') != -1 ? '\\' : '/'));
                // Gán lại Giá trị Title
                string pTitle = XmlProcess.GetValueVchLineItemFirst(xmlDoc, tagVch.Common.VchSign) + mChr.ToString();
                if (ValueHelper.isEmpty(mNo))
                    return pTitle + "0000001";
                int indexLastChr = mNo.LastIndexOf(mChr);
                ++indexLastChr; // Do chỉ số chuổi bắt đầu tính bằng 0 nên cộng thêm một để tính thêm 'Ký tự'
                double mValue = 0;
                try { mValue = (double)(ValueHelper.ChangeType(mNo.Substring(indexLastChr), typeof(double))); }
                catch { return pTitle + "0000001"; }
                ++mValue; // Tăng số chứng từ. mNo là số chứng từ có giá trị lớn nhất hiện tại trong CSDL. 
                int mIndexAdd = mNo.Length - indexLastChr - mValue.ToString().Length;
                mNo = mValue.ToString();
                for (int i = 0; i < mIndexAdd; i++)
                    mNo = "0" + mNo;
                return pTitle + mNo;
            }
            catch (Exception Ex)
            {
                throw Ex;
            }
        }
    }
}
